/* Zatok - язык программирования текстовых игр
 * (С) 2010 - 2012 Меркулов Матвей Юрьевич
 * Код лицензирован под лицензией GNU LGPL
 * Вы можете прочитать текст лицензии по адресу:
 * http://www.gnu.org/copyleft/lesser.html
 * или прочитать русский перевод по адресу:
 * http://ru.wikisource.org/wiki/GNU_Lesser_General_Public_License
 */

package base.intrface;

import base.CBase;
import base.CGraphics;
import base.CWindow;
import java.awt.Graphics;
import java.util.LinkedList;

public class CText extends CGadget{
	public String Text;
	


	public void Add( LinkedList<CGadget> GadgetList, int NewX, int NewY, int NewWidth, int NewHeight, String NewText ) {
		CText TextGagdet = new CText();
		TextGagdet.SetParams( NewX, NewY, NewWidth, NewHeight, NewText );
		GadgetList.add( TextGagdet );
	}



	public void SetParams( int NewX, int NewY, int NewWidth, int NewHeight, String NewText ) {
		X = NewX;
		Y = NewY;
		Width = NewWidth;
		Height = NewHeight;
		Text = NewText;
	}


	
	@Override
	public void Append( CWindow Window ) {
		int CursorX = Window.NextGadgetX;
		int CursorY = Window.NextGadgetY;
		String Word = "", Line = "";
		int WordWidth = 0, LineWidth = 0;
		int SpaceWidth = CGraphics.GetCharWidth( ' ' );

		for ( int N = 0; N < Text.length(); N++ ) {
			if ( Text.charAt( N ) == ' ' ) {
				if ( CursorX + LineWidth + SpaceWidth + WordWidth > Window.Width ) {
					// перенос текста на следующую строку
					Add( Window.DisplayingGadgets, CursorX, CursorY, LineWidth, CGraphics.GetTextFontHeight(), Line );
					Line = "";
					LineWidth = 0;
					CursorY += CGraphics.GetTextFontHeight();
					CursorX = 0;
					Window.PrevSpace = false;
				}

				if ( Window.PrevSpace ) {
					// добавление пробела перед добавлением слова
					Line += " ";
					LineWidth += SpaceWidth;
				}

				// добавление слова к строке
				Line += Word;
				LineWidth += WordWidth;
				Word = "";
				WordWidth = 0;

				if ( CursorX > 0 || LineWidth > 0 ) Window.PrevSpace = true;
			} else {
				Word += Text.charAt( N );
				WordWidth += CGraphics.GetCharWidth( Text.charAt( N ) );
			}
		}
		
		if ( !Line.isEmpty() || Text.trim().isEmpty() )  {
			Add( Window.DisplayingGadgets, CursorX, CursorY, LineWidth, CGraphics.GetTextFontHeight(), Line );
			CursorX += LineWidth;
		}

		Window.NextGadgetX = CursorX;
		Window.NextGadgetY = CursorY;
		Window.PrevSpace = false;
	}


	
	@Override
	public void Draw( Graphics G, int DX, int DY ) {
		G.setColor( CGraphics.TextColor );
		DrawText( G, DX, DY );
	}



	public void DrawText( Graphics G, int DX, int DY ) {
		G.setFont( CGraphics.TextFont );
		G.drawString( Text, X + DX, Y + DY + CGraphics.TextDY );
	}



	public boolean MouseOverGadget( int DX, int DY ) {
		return CBase.InLimits( CGraphics.MouseX, X + DX, X + DX + Width - 1 ) && CBase.InLimits( CGraphics.MouseY, Y + DY, Y + DY + Height - 1 );
	}
}
